/*Copyright (C) 2013-2020 LZE*/
#include<bits/stdc++.h>
#define INF 0x7fffffff
using namespace std;
typedef long long ll;
const int N=25000010;
int n,m,s,e,b[N]={0},dis[N]={0},cnt=0,sumfw=0;
struct Edge{
	int next,to,w;
}edge[N];
int nbs[N];
inline int rd() {
	int x=0;bool ntv=false;char c=getchar();
	while((c<'0'||c>'9')&&c!='-')c=getchar();if(c=='-')ntv=true;else x=(c^48);c=getchar();
	while(c>='0'&&c<='9') {x=x*10+(c^48);c=getchar();}return ntv?-x:x;
}
void add(int _u,int _v,int _w){
	edge[++cnt].to=_v;
	edge[cnt].w=_w;
	edge[cnt].next=nbs[_u];
	nbs[_u]=cnt;
}
void prim(int _s){
	b[_s]=1;//1=False 0=True
	for(int i=1;i<=n;i++)dis[i]=INF;
	for(int i=nbs[_s];i!=0;i=edge[i].next){
		dis[edge[i].to]=min(dis[edge[i].to],edge[i].w);
	}
	dis[_s]=0;
	int k=0;dis[0]=INF;
	for(int i=1;i<n;i++){
		k=0;
		for(int j=1;j<=n;j++){
			if(!b[j]&&dis[j]<dis[k])k=j;
		}
		sumfw+=dis[k];
		b[k]=1;
		for(int j=nbs[k];j!=0;j=edge[j].next){
			int p=edge[j].to;
			if(!b[p])dis[p]=min(dis[p],edge[j].w);
		}
	}
} 	
int main() {
	n=rd();m=rd();
	for(int i=1;i<=m;i++){
		int u,v,w;
		u=rd();v=rd();w=rd();
		add(u,v,w);
		add(v,u,w);
	}
	prim(1);
	for(int i=1;i<=n;i++){
		if(b[i]==0){
			cout<<"orz";
			return 0;
		}
	}
	cout<<sumfw<<" ";
	return 0;
}
/*
4 5 1
1 2 2
1 3 3
2 3 2
2 4 4
3 4 1
*/
